
/**
 * @ProjectName: 
 * @Copyright: 2014 lisheng  All Right Reserved.
 * @address: toughheart@163.com
 * @date: 2015年1月3日 下午12:36:19
 * @Description: 本内容未经本人允许禁止使用、转发.
 */
 
package com.ls.fw.data.search.impl.dao.base;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;

import com.ls.fw.data.bean.PageBean;
import com.ls.fw.data.dao.Dao;
import com.ls.fw.data.exp.Where;
import com.ls.fw.data.search.impl.lucene.exception.IndexException;
import com.ls.fw.data.search.impl.lucene.server.LuceneServer;
import com.ls.fw.data.statement.Select;
import com.mysema.query.lucene.LuceneQuery;
import com.mysema.query.lucene.LuceneSerializer;
import com.mysema.query.types.path.DatePath;
import com.mysema.query.types.path.DateTimePath;
import com.mysema.query.types.path.NumberPath;
import com.mysema.query.types.path.PathBuilder;
import com.mysema.query.types.path.StringPath;
import com.mysema.query.types.path.TimePath;


/**
 * 
 * @author lisheng
 * @date 2015年1月3日 下午12:36:19
 * @version V1.0 
 */
public interface BaseLuceneDao extends Dao{
	

	public static final String DEFAULT_PK = "id";

	
	public LuceneServer getServer();
	

	/**
	 * 用来构造查询器
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 上午11:47:48
	 * @version V1.0
	 * @param lowerCase
	 * @param splitTerms
	 * @return
	 */
	public LuceneQuery getNewQuery(boolean lowerCase, boolean splitTerms);
	
	public LuceneQuery getNewQuery();
	
	public LuceneQuery getQuery();
	
	
	/**
	 * 用来构造查询条件
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 上午11:47:39
	 * @version V1.0
	 * @param lowerCase
	 * @param splitTerms
	 * @return
	 */
	public LuceneSerializer getNewLuceneSerializer(boolean lowerCase, boolean splitTerms);

	
	/**
	 * 用来构造查询条件
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 上午11:47:22
	 * @version V1.0
	 * @return
	 */
	public LuceneSerializer getNewLuceneSerializer();


	public PathBuilder<Object> getQueryBuilder();
	
	/**
	 * 字符条件
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 上午11:58:08
	 * @version V1.0
	 * @return
	 */
	public StringPath getStringItem(String name);
	
	/**
	 * 数字条件
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 上午11:58:18
	 * @version V1.0
	 * @param cla
	 * @return
	 */
	public <T extends Number & Comparable<?>> NumberPath<T> getNumberItem(String name,Class<T> type);

	
	public <T extends Comparable<?>> DatePath<T> getDateItem(String name,Class<T> type);

	
	public <T extends Comparable<?>> TimePath<T> getTimeItem(String name,Class<T> type);

	
	public <T extends Comparable<?>> DateTimePath<T> getDateTimeItem(String name,Class<T> type);


	/**
	 * 将文档内容转换为对象
	 * @author 李昇
	 * 2014年4月13日 下午4:19:21
	 * @param doc
	 * @param requiredType
	 * @param query
	 * @param high
	 * @return
	 */
	public <M> M doc2Obj(final Document doc,final Class<M> requiredType,final Query query,final boolean high);		
		
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 下午2:18:38
	 * @version V1.0
	 * @param doc
	 * @param entityClass
	 * @return
	 */
	<M> M doc2Obj(Document doc, Class<M> entityClass);
	
	
	
	/**
	 * 获取高亮
	 * @author 李昇
	 * 2014年4月13日 下午4:18:07
	 * @param query
	 * @return
	 */
	public Highlighter getHighlighter(final Query query);
	
	/**
	 * 根据字段获取其在索引中的值
	 * @author 李昇
	 * 2014年4月13日 下午4:17:35
	 * @param f
	 * @param doc
	 * @param highlight
	 * @param analyzer
	 * @param high
	 * @return
	 */
	public Object getValue(final java.lang.reflect.Field f,final String indexName, final Document doc, final Highlighter highlight, final Analyzer analyzer,final boolean high);


	/**
	 * 根据对象获取其索引文档对象
	 * @author 李昇
	 * 2014年4月13日 下午4:33:31
	 * @param model
	 * @return
	 */
	public <M> Document getDocument(final M model);
	
	
	/**
	 * 处理字段
	 * @author 李昇
	 * 2014年4月13日 下午7:01:35
	 * @param f
	 * @param value
	 * @return
	 */
	public Field handlField(final java.lang.reflect.Field f, final Object value);
	
	
	/**
	 * 处理外键字段
	 * @author 李昇
	 * 2014年4月13日 下午7:05:53
	 * @param fkField
	 * @param value
	 * @return
	 */
	public Field handlFKField(final java.lang.reflect.Field fkField, final Object value);
	
	
	/**
	 * 高亮显示格式
	 * @author 李昇
	 * 2014年4月25日 下午8:45:11
	 * @return
	 */
	public Formatter getHighlighterFormatter();
	

	
	/**
	 * 该字段是否高亮显示
	 * @author 李昇
	 * 2014年4月26日 下午8:23:10
	 * @param name
	 * @return
	 */
	public boolean isHigherShow(String name);


	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 下午2:36:30
	 * @version V1.0
	 * @param query
	 * @param sort
	 * @param page
	 * @param pageSize
	 * @param requiredType
	 * @param high
	 * @return
	 */
	<M> PageBean query(Query query, Sort sort, int page, int pageSize,
			Class<M> requiredType, boolean high);


	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 下午5:06:45
	 * @version V1.0
	 * @param select
	 * @return
	 * @throws IndexException
	 */
	Sort getSort(Select select);


	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 下午5:09:04
	 * @version V1.0
	 * @param select
	 * @return
	 */
	Query getQuery(Where where);


	
	/**
	 * 
	 * @author lisheng
	 * @date 2015年1月3日 下午5:17:40
	 * @version V1.0
	 * @param select
	 * @param requiredType
	 * @return
	 */
	<M> PageBean query(Select select, Class<M> requiredType);

}
